package ig.metrica.origenesdedatos;

import ig.util.ejb.IGEntityBean;
import ig.util.excepciones.DatoInvalidoExcepcion;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
import javax.naming.NamingException;

public class ConexionBean extends IGEntityBean {
    
    /**
     * @uml.property  name="nombre"
     */
    private String nombre;
    /**
     * @uml.property  name="driver"
     */
    private String driver;
    /**
     * @uml.property  name="url"
     */
    private String url;
    /**
     * @uml.property  name="usuario"
     */
    private String usuario;
    /**
     * @uml.property  name="password"
     */
    private String password;
    
    
    /**
     * @return  Returns the nombre.
     * @uml.property  name="nombre"
     */
    public String getNombre(){
        return nombre;
    }
    
    /**
     * @param nombre  The nombre to set.
     * @uml.property  name="nombre"
     */
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
    
    /**
     * @return  Returns the driver.
     * @uml.property  name="driver"
     */
    public String getDriver(){
        return driver;
    }
    
    /**
     * @param driver  The driver to set.
     * @uml.property  name="driver"
     */
    public void setDriver(String driver){
        this.driver = driver;
    }
    
    /**
     * @return  Returns the url.
     * @uml.property  name="url"
     */
    public String getUrl(){
        return url;
    }
    
    /**
     * @param url  The url to set.
     * @uml.property  name="url"
     */
    public void setUrl(String url){
        this.url = url;
    }
    
    /**
     * @return  Returns the usuario.
     * @uml.property  name="usuario"
     */
    public String getUsuario(){
        return usuario;
    }
    
    /**
     * @param usuario  The usuario to set.
     * @uml.property  name="usuario"
     */
    public void setUsuario(String usuario){
        this.usuario = usuario;
    }
    
    /**
     * @return  Returns the password.
     * @uml.property  name="password"
     */
    public String getPassword(){
        return password;
    }
    
    /**
     * @param password  The password to set.
     * @uml.property  name="password"
     */
    public void setPassword(String password){
        this.password = password;
    }
    
    public ConexionPK ejbCreate(String nombre, String driver, String url, String usuario, String password) throws CreateException{
        
        this.nombre = nombre;
        this.driver = driver;
        this.url = url;
        this.usuario = usuario;
        this.password = password;
        ResultSet r = null;
        try {
            conn = getConexion("METRICADB");
            pstmt1 = conn.prepareStatement("SELECT MAX(ID) AS MAXIMO FROM CONEXIONES");
            r = pstmt1.executeQuery();
            r.next();
            int idInterna = r.getInt("MAXIMO")+1;
            pstmt1.close();
            pstmt1 = conn.prepareStatement("INSERT INTO CONEXIONES VALUES(?,?,?,?,?,?)");
            pstmt1.setInt(1, idInterna);
            pstmt1.setString(2, nombre!=null && nombre.trim().equals("")?" ":nombre);
            pstmt1.setString(3, driver!=null && driver.trim().equals("")?" ":driver);
            pstmt1.setString(4, url!=null && url.trim().equals("")?" ":url);
            pstmt1.setString(5, usuario!=null && usuario.trim().equals("")?" ":usuario);
            pstmt1.setString(6, password!=null && password.trim().equals("")?" ":password);
            
            pstmt1.executeUpdate();
            ConexionPK pk=new ConexionPK(idInterna);
            return pk;
        } catch (Exception e) {
            throw new CreateException(e.toString());
        }finally{
            try {pstmt1.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
            try {r.close();} catch (Exception e) {}
        }
    }
    
    public void ejbPostCreate(String nombre, String driver, String url, String usuario, String password){}
    
    
    public void cargarEntidad() throws NamingException, SQLException{
        ResultSet r = null;
        try {
            ConexionPK pk = (ConexionPK)ctx.getPrimaryKey();
            long idInterna = pk.getIdInterna();
            conn = getConexion("METRICADB");
            pstmt1 = conn.prepareStatement("SELECT NOMBRE, DRIVER, URL, USUARIO, PASSWORD FROM CONEXIONES WHERE ID=? ORDER BY ID");
            pstmt1.setLong(1, idInterna);
            r = pstmt1.executeQuery();
            r.next();
            this.nombre = r.getString("NOMBRE");
            this.driver = r.getString("DRIVER");
            this.url = r.getString("URL");
            this.usuario = r.getString("USUARIO");
            this.password = r.getString("PASSWORD");
        } catch (Exception e) {
            throw new SQLException(e.toString());
        }finally{
            try {pstmt1.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
            try {r.close();} catch (Exception e) {}
        }
    }
    
    public void actualizarEntidad() throws DatoInvalidoExcepcion, NamingException, SQLException{
        try {
/*            if ( nombre.trim().equals("") || driver.trim().equals("") || url.trim().equals("")
            || usuario.trim().equals("") ){
                throw new DatoInvalidoExcepcion("Alguna de las propiedades de la conexion posee un valor invalido.");
            }
*/
            ConexionPK pk = (ConexionPK)ctx.getPrimaryKey();
            
            long idInterna = pk.getIdInterna();
            
            conn = getConexion("METRICADB");
            
            pstmt1 = conn.prepareStatement("UPDATE CONEXIONES SET NOMBRE=?, DRIVER=?, URL=?, USUARIO=?, PASSWORD=? WHERE ID=?");
            pstmt1.setString(1, nombre!=null && nombre.trim().equals("")?" ":nombre);
            pstmt1.setString(2, driver!=null && driver.trim().equals("")?" ":driver);
            pstmt1.setString(3, url!=null && url.trim().equals("")?" ":url);
            pstmt1.setString(4, usuario!=null && usuario.trim().equals("")?" ":usuario);
            pstmt1.setString(5, password!=null && password.trim().equals("")?" ":password);
            pstmt1.setLong(6, idInterna);
            
            pstmt1.executeUpdate();
        } catch (Exception e) {
            throw new SQLException(e.toString());
        }finally{
            try {pstmt1.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
        }
    }
    
    public void eliminarEntidad() throws RemoveException, SQLException, NamingException{
        try {
            ConexionPK pk = (ConexionPK)ctx.getPrimaryKey();            
            long idInterna = pk.getIdInterna();            
            conn = getConexion("METRICADB");            
            pstmt1 = conn.prepareStatement("DELETE FROM CONEXIONES WHERE ID=?");
            pstmt1.setLong(1, idInterna);
            
            if (pstmt1.executeUpdate()==0){
                throw new RemoveException("No se pudo eliminar la conexion " + nombre );
            }
        } catch (Exception e) {
            throw new SQLException(e.toString());
        }finally{
            try {pstmt1.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
        }
    }
    
    public ConexionPK ejbFindByPrimaryKey(ConexionPK pk) throws FinderException{
        try {
            conn = getConexion("METRICADB");            
            pstmt1 = conn.prepareStatement("SELECT ID FROM CONEXIONES WHERE ID=?");
            pstmt1.setLong(1, pk.getIdInterna() );
            
            ResultSet r = pstmt1.executeQuery();
            if (r.next()==false)
                throw new FinderException("No fue posible encontrar la conexion " + pk.getIdInterna());            
            return pk;
        } catch (Exception e) {
            throw new FinderException(e.toString());
        }finally{
            try {pstmt1.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
        }
        
    }
    
    public Collection ejbFindByPropiedades( String nombre, String driver, String url, String usuario, String password ) throws FinderException{
        ArrayList resultado = new ArrayList();
        Statement s = null;
        ResultSet r = null;
        try {
            conn = getConexion("METRICADB");
            
            boolean condicion1 = false, condicion2 = false, condicion3 = false, condicion4 = false, condicion5 = false;
            String query = "SELECT NOMBRE, ID FROM CONEXIONES ";
            if ( (condicion1 = !nombre.trim().equals("") ) || (condicion2 = !driver.trim().equals("")) || (condicion3 = !url.trim().equals(""))  || (condicion4 = !usuario.trim().equals("")) /*|| (condicion5 = !password.trim().equals(""))*/ )
                query += " WHERE ID=ID ";
            if (condicion1)
                query += " AND NOMBRE LIKE '%"+ nombre +"%' ";
            if (condicion2)
                query += " AND DRIVER LIKE '%"+ driver +"%' ";
            if (condicion3)
                query += " AND URL LIKE '%"+ url +"%' ";
            if (condicion4)
                query += " AND USUARIO LIKE '%"+ usuario +"%' ";
            if (condicion5)
                query += " AND PASSWORD LIKE '%"+ password +"%' ";
            
            query += "  ORDER BY ID ";
            
            s = conn.createStatement();
            r = s.executeQuery(query);
            
            while (r.next()){
                ConexionPK registro = new ConexionPK( (new Integer(r.getInt("ID"))).intValue() );
                resultado.add( registro );
            }
            
        } catch (Exception e) {
            throw new FinderException(e.toString());
        }finally{
            try {s.close();} catch (Exception e) {}
            try {r.close();} catch (Exception e) {}
            try {conn.close();} catch (Exception e) {}
        }
        return resultado;
    }
    
    public String toString() {
        return this.nombre;
    }
    
}
